home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / ippon / source.lzh / FuncEnemy / oplaser.c < prev    next >
C/C++ Source or Header  |  2000-07-07  |  4KB  |  177 lines

  1. /* oplaser.c 左右に開いてレーザー */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../main.h"
  5. #include "../player.h"
  6. #include "../shot.h"
  7. #include "../enemy.h"
  8. #include "../eshot.h"
  9. #include "../effect.h"
  10. #include "../psearch.h"
  11. #include "../sound.h"
  12.  
  13. #define PALET_MAIN    0x0600
  14.  
  15. #define HP_0        48    /* 耐久力 */
  16.  
  17. /* 関数プロトタイプ宣言 */
  18. static short EnemyMoveOplaser (ENEMY *);
  19. static void EnemyFreeOplaser (ENEMY *);
  20.  
  21. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  22.  
  23.  
  24. /* 初期化ルーチン */
  25. void EnemyAllocOplaser (ENEMY * p)
  26. {
  27.     p->vx = 0;
  28.     p->vy = 2 * 65536;
  29.  
  30.     p->pt = obj_oplaser;
  31.     p->info = PALET_MAIN | PRIORITY_BOSS;
  32.  
  33.     p->hit_sx = 24;        /* 自機ショットに対する当たり判定 */
  34.     p->hit_sy = 16;
  35.  
  36.     p->hp = HP_0;
  37.     p->damage = 0;
  38.     p->flash = 0;
  39.  
  40.     p->damage_mode = DAMAGE_PIERCE;
  41.     p->func_enemy_move = EnemyMoveOplaser;
  42.     p->func_enemy_free = EnemyFreeOplaser;
  43.  
  44.     /* コア関連 */
  45.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS_CORE;
  46.     p->core_pt = sp_core;
  47.  
  48.     p->m_work = 0;
  49.     p->m_work2 = 0;
  50. }
  51.  
  52.  
  53. /* 移動ルーチン */
  54. /* 返り値:非0なら消去 */
  55. static short EnemyMoveOplaser (ENEMY * p)
  56. {
  57.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  58.     p->x = (p->lx += p->vx) >> 16;
  59.     p->y = (p->ly += p->vy) >> 16;
  60.  
  61.     switch (p->m_work) {
  62.     case 0:
  63.         if (p->m_work2++ > 48) {
  64.             p->m_work++;
  65.             p->m_work2 = 0;
  66.         }
  67.         break;
  68.     case 1:
  69.         p->vy -= 2048;
  70.         if (p->vy <= -8192)
  71.             p->m_work++;
  72.         break;
  73.     case 2:
  74.         if (p->pt == obj_oplaser + 27)
  75.             SoundSetSE (SE_LOCK_M);        /* 「がちゃん」という効果音を鳴らす */
  76.         if (p->pt < obj_oplaser + 35) {
  77.             p->pt++;
  78.         } else {
  79.             p->m_work++;
  80.             p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  81.             p->s_work = 0;
  82.         }
  83.         break;
  84.  
  85.         /* ショット発射 */
  86.     case 3:
  87. #define INTERVAL_SHOT    9
  88. #define SPEED_SHOT        12
  89.         switch (p->s_work++) {
  90.         case 1:
  91.             p->s_work2 = SPEED_SHOT;    /* ショットの速度 */
  92.             p->s_work3 = ESHOT_NRG05;    /* ショットの種類 */
  93.             break;
  94.         case 4 + INTERVAL_SHOT * 1:
  95.         case 4 + INTERVAL_SHOT * 2:
  96.         case 4 + INTERVAL_SHOT * 3:
  97.         case 4 + INTERVAL_SHOT * 4:
  98.             EshotAlloc (p->s_work3, SHORT_LX - 18, SHORT_LY + 20, p->s_work2, 64, 0);
  99.             EshotAlloc (p->s_work3, SHORT_LX + 18, SHORT_LY + 20, p->s_work2, 64, 0);
  100.             p->s_work2 -= 3;
  101.             p->s_work3--;
  102.             SoundSetSE (SE_ESHOT_M);
  103.             break;
  104.         case 4 + INTERVAL_SHOT * 10:
  105.             p->m_work++;
  106.             break;
  107.         default:
  108.             break;
  109.         }
  110.         break;
  111.  
  112.         /* 撤退 */
  113.     case 4:
  114.         if (p->vy > -1 * 65536)
  115.             p->vy -= 4096;
  116.         /* 画面外に出たら消去 */
  117.         if (SHORT_LY < -64)
  118.             return (-1);    /* 消去 */
  119.         break;
  120.     }
  121.  
  122.     /* もし前回ダメージを受けたなら */
  123.     if (p->damage) {
  124.         p->hp -= p->damage;
  125.         p->damage = 0;
  126.         SoundSetSE (SE_DAMAGE);        /* 敵ダメージ音 */
  127.  
  128.         /* 白(or赤)フラッシュ処理 */
  129.         if (p->info == (PALET_MAIN | PRIORITY_BOSS)) {
  130.             if (p->hp < HP_PALET_RED)
  131.                 p->info = PALET_RED | PRIORITY_BOSS;
  132.             else
  133.                 p->info = PALET_DAMAGE | PRIORITY_BOSS;
  134.         } else {
  135.             p->info = PALET_MAIN | PRIORITY_BOSS;
  136.         }
  137.  
  138.  
  139.         /* 耐久力が0以下なら消去 */
  140.         if (p->hp <= 0) {
  141.             EffectAlloc (EFFECT_EXPL, 0, p->x, p->y);    /* 爆発パターンを出現させる */
  142.             EffectAlloc (EFFECT_POINTS, POINTS_2500, p->x, p->y);    /* 得点を出現させる */
  143.             SoundSetSE (SE_EXPL_M);        /* 中ボス爆発音 */
  144.             return (-1);
  145.         }
  146.     } else {
  147.         /* 耐久力が少なくなったら赤フラッシュ */
  148.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < HP_PALET_RED)) {
  149.             p->info = PALET_RED | PRIORITY_BOSS;
  150.             if (p->flash > TIMER_FLASH_NORMAL)
  151.                 p->flash = 0;
  152.         } else {
  153.             p->info = PALET_MAIN | PRIORITY_BOSS;
  154.         }
  155.     }
  156.     xobj_set_st (p);    /* 表示 */
  157.  
  158.  
  159.     /* コアの表示 */
  160.     p->core_x = p->x - 8;    /* コアの中心は (-8,-8) ドットずれる */
  161.     p->core_y = p->y - 8;
  162.     xsp_set_st (&(p->core_x));
  163.  
  164.  
  165.     return (0);
  166. }
  167.  
  168.  
  169.  
  170. /* 消去ルーチン */
  171. static void EnemyFreeOplaser (ENEMY * p)
  172. {
  173.     /* 刺さったショットの処理 */
  174.     if ((p->shot) && (p->shot->enemy) && (p->shot->enemy == p))
  175.         p->shot->status = SHOT_STATUS_NON;
  176. }
  177.